package com.dahua.synthetic;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

/**
 * @author chen_MingLiang
 * @version 1.0
 * @date 2020/1/30 10:41
 */
public class SyntheticX {
		SynInner synInner = new SynInner();
		public void testPri(){
			System.out.println(synInner.i);
		}

	class SynInner{
		//在java语法中,一个类的私有变量只有本类能访问.
		//但是作为一个内部类.java又想让他的外部类有访问权限,这就和java本身的语法规则矛盾
		//为了解决这个矛盾,java在编译的时候其实在这个内部类给这个i变量多加了一个public的get方法,名字为access$000--->
		//-->这个方法通过反编译是看不到的,我们通过反射获取类信息来看,循环打印方法.按理说内部类中一个方法也没有的,但是这里会打印出这个access$000方法
		//如果不定义这个内部的变量,那么就不会有这个方法
		//这个access$000方法就叫做合成方法
		private int i;
		//那什么是合成类?我们在这个内部类里面加一个私有的构造方法,就会多出一个外部类的class文件,尾部多个1
		//为什么?因为这个私有的构造,只能在本类中使用,不对外开放,但是和上面一样,它是个内部类,又想让它在外部类可以被new,那么 又和我们java的语法冲突-->
		//-->为了解决这个矛盾,java在编译的时候,又加了代码,多了一个public的构造方法.但是如果是无参构造,就会和原来的私有构造冲突,那么它必须要传参-->
		//-->这个时候,这个参数就是合成类-->SyntheticX$1.class
		private SynInner(){}
	//	public SynInner(>SyntheticX$1 s){}

	}

	public static void main(String[] args) {
		System.out.println("test");
		for (Method declaredMethod : SynInner.class.getDeclaredMethods()) {
			System.out.println(declaredMethod);
		}
		for (Constructor<?> declaredConstructor : SynInner.class.getDeclaredConstructors()) {
			for (Parameter parameter : declaredConstructor.getParameters()) {
				System.out.println(parameter.getType());
			}
		}
	}
}
